/*Anhand des Abego Treelayout Beispiels

 Klasse enthält alle Funktionen die zum Aufbau der Scene mit dem Baum benötigt werden
 */
package controller;

import java.awt.Color;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import org.netbeans.api.visual.anchor.Anchor;
import org.netbeans.api.visual.anchor.AnchorFactory;
import org.netbeans.api.visual.anchor.AnchorShape;
import org.netbeans.api.visual.graph.GraphScene;

import org.netbeans.api.visual.layout.LayoutFactory;

import org.netbeans.api.visual.widget.ConnectionWidget;
import org.netbeans.api.visual.widget.LabelWidget;
import org.netbeans.api.visual.widget.LayerWidget;
import org.netbeans.api.visual.widget.Widget;

import model.Baum;
import model.Kante;
import model.Knoten;
import java.lang.Object.*;
import org.netbeans.api.visual.action.ActionFactory;
import org.netbeans.api.visual.action.SelectProvider;
import view.BaumInteraktiv;

/**
 *
 * @author Kerstin
 */
public class TreeSceneErstellerInteraktiv extends GraphScene<Knoten, Kante> {
//GraphScene<String, String>

    private LayerWidget mainLayer;
    private LayerWidget connectionLayer;
    private Baum baum;
    private ArrayList<Knoten> arrayKnoten;
    private ArrayList<Kante> arrayKanten;
    private Knoten wurzel;
    private BaumInteraktiv parentFrame;

    //Ein Objekt vom Typ Baum übergeben
    //Aus diesem können dann die Knoten und ausgelesen werden
    public TreeSceneErstellerInteraktiv(Knoten wurzel) {
        mainLayer = new LayerWidget(this);
        connectionLayer = new LayerWidget(this);
        addChild(mainLayer);
        addChild(connectionLayer);
        arrayKnoten = new  ArrayList<>();
        this.wurzel=wurzel;
        //arrayKnoten.set(0, wurzel);
        addNode(wurzel);
        arrayKnoten.add(wurzel);
     }
    
    public void setWurzel(Knoten wurzelNeu){
        removeNode(wurzel);
        this.wurzel=wurzelNeu;
        addNode(wurzel);
    }

    public Knoten getWurzel() {
        return arrayKnoten.get(0);
    }
    
    public  Rectangle getGroesse(){
        return this.getBounds();
    }

    public void erzeugeBaum() {
        erzeugeKnoten();
        erzeugeKanten();
    }
    
    public void erzeugeKnoten(){
        //Alle Knoten erzeugen und auf die Scene packen
        for (int i = 0; i <= arrayKnoten.size() - 1; i++) {
            addNode(arrayKnoten.get(i));
        }
    }

    public void erzeugeKanten() {
         for (int i=0; i<=arrayKanten.size()-1; i++){
             fuegeKanteEin(arrayKanten.get(i));
         }
    }

    public void baueKante(Knoten startK, Knoten endK, String titel){
        addNode(endK);
        if (startK.equals(wurzel)){
            Kante kante = new Kante(wurzel, endK, titel);
            System.out.println(endK.getLabel());
            fuegeKanteEin(kante);
            System.out.println("Verbindung von Wurzel");
        }
        else {
            Kante kante = new Kante(startK, endK, titel);
            fuegeKanteEin(kante);
        }
        
            
    }
    
    public void fuegeKanteEin(Kante kante) {
        addEdge(kante);
        //Startpunkt der Kante 
        setEdgeSource(kante, kante.getStartKnoten());
        //ENdpunkt der Kante
        setEdgeTarget(kante, kante.getEndKnoten());    
    }

    @Override
    protected Widget attachNodeWidget(final Knoten n) {
        final LabelWidget w = new LabelWidget(this);
        w.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        w.setLabel(" " + n.getLabel() + " ");
        w.getActions().addAction(ActionFactory.createSelectAction(new SelectProvider() {

            @Override
            public boolean isAimingAllowed(Widget widget, Point point, boolean bln) {
                return true; //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean isSelectionAllowed(Widget widget, Point point, boolean bln) {
                return true; //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void select(Widget widget, Point point, boolean bln) {
                parentFrame.setWurzel(n);
                parentFrame.calcKnoten(n.getTabelle(), n.getIndex());
            }
        }));
        getMainLayer().addChild(w);
        return w;
    }

    @Override
    protected Widget attachEdgeWidget(Kante e) {
        ConnectionWidget cW = new ConnectionWidget(this);
        cW.setTargetAnchorShape(AnchorShape.TRIANGLE_FILLED);
        
        //BEschriftung der Kante 
        LabelWidget beschriftung = new LabelWidget(this, e.getLabel());
        cW.setToolTipText(e.getLabel());
        beschriftung.setOpaque (true);
        //label2.getActions ().addAction (ActionFactory.createMoveAction ());
        cW.addChild (beschriftung);
        cW.setConstraint (beschriftung, LayoutFactory.ConnectionWidgetLayoutAlignment.CENTER, 0.5f);
        //label2.getActions ().addAction (action);

        getConnectionLayer().addChild(cW);
        return cW;
    }

    @Override
    protected void attachEdgeSourceAnchor(Kante e, Knoten n, Knoten n1) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        ConnectionWidget edgeWidget = (ConnectionWidget) findWidget(e);
        Widget sourceNodeWidget = findWidget(n1);
        Anchor sourceAnchor = AnchorFactory
                .createRectangularAnchor(sourceNodeWidget);
        edgeWidget.setSourceAnchor(sourceAnchor);
    }

    @Override
    protected void attachEdgeTargetAnchor(Kante e, Knoten n, Knoten n1) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        ConnectionWidget edgeWidget = (ConnectionWidget) findWidget(e);
        Widget targetNodeWidget = findWidget(n1);
        Anchor targetAnchor = AnchorFactory
                .createRectangularAnchor(targetNodeWidget);
        edgeWidget.setTargetAnchor(targetAnchor);
    }

    /**
     * @param parentFrame the parentFrame to set
     */
    public void setParentFrame(BaumInteraktiv parentFrame) {
        this.parentFrame = parentFrame;
    }

    /**
     * @return the mainLayer
     */
    public LayerWidget getMainLayer() {
        return mainLayer;
    }

    /**
     * @return the connectionLayer
     */
    public LayerWidget getConnectionLayer() {
        return connectionLayer;
    }

}
